/**
 * 抽象类
 * 定义一个规范
 * 提供一些写完的方法
 */
abstract class Package {
  // 构造方法
  constructor(public weight: number) { }
  // 抽象方法：不具体实现
  abstract calculate(): number
  // 具体方法
  printPackage() {
    console.log(`包裹重量为：${this.weight}kg，运费为：${this.calculate()}元`)
  }
}


// 派生类
class StandardPackage extends Package {
  constructor(
    weight: number,    // 继承 weight，不需要public
    public unitPrice: number  // 自己定义的，需要 public (用于简写)
  ) { super(weight) }

  // 必须写calculate抽象方法的具体方法
  calculate(): number {
    return this.weight * this.unitPrice
  }
}


// 派生类
class ExpressPackage extends Package {
  constructor(
    weight: number,    // 继承 weight，不需要public
    public unitPrice: number,  // 自己定义的，需要 public (用于简写)
    public addtionPrice: number  // 自己定义的，需要 public (用于简写)
  ) { super(weight) }

  // 必须写calculate抽象方法的具体方法
  calculate(): number {
    if (this.weight > 10) {
      return 10 * this.unitPrice + (this.weight - 10) * this.addtionPrice
    } else {
      return this.weight * this.unitPrice
    }
  }
}

const p1 = new StandardPackage(20,12)
p1.printPackage()
